/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.servicio.impl;

import com.ec.medical.entidades.Cliente;
import com.ec.medical.entidades.DireccionCliente;
import com.ec.medical.exepciones.ClienteException;
import com.ec.medical.servicio.ClienteServicioLocal;
import com.ec.medical.servicio.DireccionClienteServicioLocal;
import com.ec.medical.servicio.UsuarioServicioLocal;
import com.ec.medical.util.ParametrosBusquedaClienteUtil;
import com.ec.medical.util.Utilitarios;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Query;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@Stateless
public class ClienteServicioImpl extends ServicioBase<Cliente> implements ClienteServicioLocal {

    private Logger LOG = Logger.getLogger(ClienteServicioImpl.class.getName());
    @EJB
    private DireccionClienteServicioLocal direccionClienteServicio;
    @EJB
    private UsuarioServicioLocal usuarioServicio;

    public ClienteServicioImpl() {
        super(Cliente.class);
    }

    /**
     * MEtodo que recupera el cliente cargando sus direcciones
     *
     * @param cliente
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Cliente obtenerClienteConDirecciones(Cliente cliente) {
        Query query = em.createNamedQuery("Cliente.findByCodigoCliente");
        query.setParameter("codigoCliente", cliente.getCodigoCliente());
        cliente = (Cliente) query.getSingleResult();
        cliente.getDireccionesCliente().size();
        return cliente;
    }

    /**
     * Metodo que crea un nuevo cliente con su direccion, mascota(s), metodo
     * usado en el ingreso de cliente por parte de la aseguradora
     *
     * @param cliente
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void ingresarNuevoCliente(Cliente cliente, DireccionCliente direccionCliente) throws ClienteException {
        try {
            create(cliente);
            direccionCliente.setCliente(cliente);
            direccionClienteServicio.crearDireccionCliente(direccionCliente);
        } catch (Exception e) {
            LOG.error("..ingresarNuevoCliente  " + e);
            throw new ClienteException("Error al crear Cliente");
        }
    }

    /**
     * Metodo que busca Cliente por parametros
     *
     * @param parametros
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Cliente> buscarClientePorParametros(ParametrosBusquedaClienteUtil parametros) {
        Map<String, Object> mapaParametros = new HashMap<String, Object>();

        String jpql = "SELECT m FROM Cliente m WHERE 1=1 ";


        if (!Utilitarios.esNulo(parametros.getCliente()) && !Utilitarios.esNulo(parametros.getCliente().getCodigoCliente())) {
            jpql += " AND m.codigoCliente = :codigoCliente ";
            mapaParametros.put("codigoCliente", parametros.getCliente().getCodigoCliente());
        }

        if (!Utilitarios.esNuloOVacio(parametros.getIdentificacion())) {
            jpql += " AND m.cedula LIKE :identificacion ";
            mapaParametros.put("identificacion", "%" + parametros.getIdentificacion() + "%");
        }

        if (!Utilitarios.esNuloOVacio(parametros.getNombreCliente())) {
            jpql += " AND m.nombre LIKE :nombre ";
            mapaParametros.put("nombre", "%" + parametros.getNombreCliente() + "%");
        }

        if (!Utilitarios.esNuloOVacio(parametros.getApellidoPaterno())) {
            jpql += " AND m.apellidoPaterno LIKE :apellidoPaterno ";
            mapaParametros.put("apellidoPaterno", "%" + parametros.getApellidoPaterno() + "%");
        }

        if (!Utilitarios.esNuloOVacio(parametros.getApellidoMaterno())) {
            jpql += " AND m.apellidoMaterno LIKE :apellidoMaterno ";
            mapaParametros.put("apellidoMaterno", "%" + parametros.getApellidoMaterno() + "%");
        }

        Query query = em.createQuery(jpql);

        for (Map.Entry<String, Object> entry : mapaParametros.entrySet()) {
            String string = entry.getKey();
            Object object = entry.getValue();
            query.setParameter(string, object);
        }
        return query.getResultList();
    }
}
